#include "myFunctions.h"
#include "gnuplot.h"
#include <algorithm>
#include <climits>
# include <math.h>
#include <time.h>
#include <limits.h>

using namespace std;

struct hiddenNeuron{
	vector<double> mean, desv_2;
	double desv_0, desv_1;
	vector<vector<double> >desv_3;
	vector<double>out;
};	

struct outputNeuron{
	vector<double> w;
};

class RBF{
private:
	vector<hiddenNeuron> hiddens;
	vector<outputNeuron> outputs;
	int nHiddens, nOutputs, nInputs, typeDesv, maxEpocas;
	float etaOnline, etaLMS, deltaError;
	bool typeKmeans, plot;

	vector<vector<int> > hide2data;	//Matriz donde en cada fila están los datos pertenecientes a un conjunto
	vector<int> data2hide;	//Vector columna con los conjuntos para cada dato

	void batchKmeans(int nData, vector<vector<double> >& data);
	void onlineKmeans(int nData, vector<vector<double> >& data);
	void desvCase0( vector<vector<double> >& data);
	void desvCase1( vector<vector<double> >& data);
	void desvCase2( vector<vector<double> >& data);
	void desvCase3( vector<vector<double> >& data);
	void calculateDesv( vector<vector<double> >& data);
	double calcOut0(int nGaussean, vector<double>& data);
	double calcOut1(int nGaussean, vector<double>& data);
	double calcOut2(int nGaussean, vector<double>& data);
	double calcOut3(int nGaussean,vector<double>& data);	
	double gausseanOut(int nGaussean, vector<double>& data);
	void lms(int nData, vector<vector<double> >& data, vector<vector<int> >& targets);
	void loadConfig(string file);
	void randomWeights();
	float uniform();
	void printData(vector<string> paths);
	void plotSets(vector<vector<double> >& data);
public:
	RBF();
	RBF(RBF* RB);
	RBF(string file);
	void training(vector<vector<double> >& data, vector<vector<int> >& targets);
	double test(vector<vector<double> >& data, vector<vector<int> >& targets);
};
